# 实验四：
# 对一副图像加噪声（高斯，椒盐等），进行平滑，锐化，观察其图像变化
# 步骤：1：对一副图像加高斯噪声、椒盐
#      2：进行平滑，锐化，观察其图像变化
# 噪声可以理解为灰度值的随机变化，即拍照过程中引入的一些不想要的像素点。噪声可分为椒盐噪声，高斯噪声，加性噪声和乘性噪声等
# **高斯噪声gaussianian noise
# 高斯噪声，顾名思义是指服从高斯分布（正态分布）的一类噪声，通常是因为不良照明和高温引起的传感器噪声。通常在RGB图像中，显现比较明显
# **椒盐噪声Salt and pepper noise：
# 椒盐噪声也称为脉冲噪声，是图像中经常见到的一种噪声，它是一种随机出现的白点或者黑点，
# 可能是亮的区域有黑色像素或是在暗的区域有白色像素（或是两者皆有）。
# 椒盐噪声的成因可能是影像讯号受到突如其来的强烈干扰而产生、类比数位转换器或位元传输错误等。

# 噪声主要通过平滑进行抑制和去除，包括基于二维离散卷积的高斯平滑，均值平滑，基于统计学的中值平滑，以及能够保持图像边缘的双边滤波，导向滤波算法等
import cv2
import numpy as np
import random


def sp_noise(image, prob):
    # 添加椒盐噪声
    # prob:噪声比例
    output = np.zeros(image.shape, np.uint8)
    thres = 1 - prob
    for i in range(image.shape[0]):
        for j in range(image.shape[1]):
            rdn = random.random()
            if rdn < prob:
                output[i][j] = 0
            elif rdn > thres:
                output[i][j] = 255
            else:
                output[i][j] = image[i][j]
    return output


def gaussian_noise(image, mean=0, var=0.001):
    # 添加高斯噪声
    # mean : 均值
    # var : 方差
    image = np.array(image / 255, dtype=float)
    noise = np.random.normal(mean, var ** 0.5, image.shape)
    out = image + noise
    if out.min() < 0:
        low_clip = -1.
    else:
        low_clip = 0.
    out = np.clip(out, low_clip, 1.0)
    out = np.uint8(out * 255)
    return out


def sharpen(image):
    # 锐化
    kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)
    out = cv2.filter2D(image, -1, kernel=kernel)
    return out


src = cv2.imread('img/lena.png')
img_sp = sp_noise(src, 0.05)
img_gaussian = gaussian_noise(src, 0.1, 0.03)

cv2.imshow('src', src)
cv2.imshow('img_sp', img_sp)
cv2.imshow('img_gaussian', img_gaussian)
cv2.waitKey(0)

# cv2.medianBlur是中值平滑，blur()是均值平滑，gaussianianBlur()高斯平滑
# https://www.cnblogs.com/silence-cho/p/11027218.html有对各种平滑函数有详细讲解
# cv2.medianBlur的第二个参数5，可以修改 数字不一样 平滑效果也不一样
img_sp_medianblur = cv2.medianBlur(img_sp,5)
img_gaussian_medianblur = cv2.medianBlur(img_gaussian, 5)
# img_gaussian_aussianBlur= cv2.gaussianianBlur(img_gaussian,(0,0),2)

# 下面把有椒盐噪声的图片和对它进行平滑的图片 对比
# cv2.imshow('img_sp', img_sp)
# cv2.imshow('img_sp_medianblur', img_sp_medianblur)

# 下面把有椒盐噪声的图片和对它进行平滑的图片 对比
# cv2.imshow('img_gaussian', img_gaussian)
# cv2.imshow('img_gaussian_medianblur', img_gaussian_medianblur)
# cv2.waitKey(0)


# img_sharpen=sharpen(src)
# img_sp_sharpen=sharpen(img_sp)
# img_gaussian_sharpen=sharpen(img_gaussian)
# img_sp_medianblur_sharpen=sharpen(img_sp_medianblur)
# img_gaussian_medianblur_sharpen=sharpen(img_gaussian_medianblur)
# cv2.imshow('img_sharpen', img_sharpen)
# cv2.imshow('img_sp_sharpen', img_sp_sharpen)
# cv2.imshow('img_gaussian_sharpen', img_gaussian_sharpen)
# cv2.imshow('img_sp_medianblur_sharpen', img_sp_medianblur_sharpen)
# cv2.imshow('img_gaussian_medianblur_sharpen', img_gaussian_medianblur_sharpen)
# cv2.waitKey(0)



